'use strict';

//node.js 文件操作对象
const fs = require('fs');
//node.js 路径操作对象
const path = require('path');
//egg.js Controller
const Controller = require('egg').Controller;
//故名思意 异步二进制 写入流
const awaitWriteStream = require('await-stream-ready').write;
//管道读入一个虫洞。
const sendToWormhole = require('stream-wormhole');
//当然你也可以不使用这个 哈哈 个人比较赖
//还有我们这里使用了egg-multipart
const md5 = require('md5');

class UploadController extends Controller {

    /**
     * 上传图片并压缩
     */
    async zipimg() {
        const { ctx } = this;
        console.log("图片上传中。。。");
        //egg-multipart 已经帮我们处理文件二进制对象
        // node.js 和 php 的上传唯一的不同就是 ，php 是转移一个 临时文件
        // node.js 和 其他语言（java c#） 一样操作文件流
        const stream = await ctx.getFileStream();
        //新建一个文件名
        const filename = md5(stream.filename) + path
            .extname(stream.filename)
            .toLocaleLowerCase();
        //文件生成绝对路径
        let nowDateStr = new Date().toLocaleDateString().replace(/\-/g, "");
        let fpath = 'app/public/uploads/' + nowDateStr + "/";
        //判断文件夹fpath是否存在
        var folder_exists = fs.existsSync(this.config.baseDir + fpath);
        if (!folder_exists) {
            //不存在，生成一个文件夹
            fs.mkdirSync(this.config.baseDir + fpath);
        }
        //生成一个文件文件路径
        const target = path.join(this.config.baseDir, fpath, filename);
        //生成一个文件写入 文件流
        const writeStream = fs.createWriteStream(target);
        try {
            //异步把文件流 写入
            await awaitWriteStream(stream.pipe(writeStream));
        } catch (err) {
            //如果出现错误，关闭管道
            await sendToWormhole(stream);
            throw err;
        }
        //文件响应，返回路径
        ctx.body = {
            code: 200,
            path: '/public/uploads/' + nowDateStr + "/" + filename
        };
    }
}

module.exports = UploadController;